package com.english.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.english.entity.Lesson;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 课时数据访问层
 *
 * @author wlq
 * @since 2025-08-05
 */
@Mapper
public interface LessonMapper extends BaseMapper<Lesson> {

    /**
     * 根据学生ID查询课时信息（返回第一个班级的记录，用于兼容性）
     * 
     * @param studentId 学生ID
     * @return 课时信息
     */
    @Select("SELECT * FROM lesson WHERE student_id = #{studentId} ORDER BY class_id LIMIT 1")
    Lesson selectByStudentId(@Param("studentId") Long studentId);

    /**
     * 根据学生ID和班级ID查询课时信息
     * 
     * @param studentId 学生ID
     * @param classId 班级ID
     * @return 课时信息
     */
    @Select("SELECT * FROM lesson WHERE student_id = #{studentId} AND class_id = #{classId}")
    Lesson selectByStudentIdAndClassId(@Param("studentId") Long studentId, @Param("classId") Long classId);

    /**
     * 根据学生ID查询所有班级的课时信息
     * 
     * @param studentId 学生ID
     * @return 课时信息列表
     */
    @Select("SELECT * FROM lesson WHERE student_id = #{studentId} ORDER BY class_id")
    List<Lesson> selectAllByStudentId(@Param("studentId") Long studentId);

    /**
     * 统计所有学生的总课时数
     * 
     * @return 总课时数
     */
    @Select("SELECT COALESCE(SUM(total_hours), 0) FROM lesson")
    Integer sumTotalHours();

    /**
     * 统计指定学生的总课时数（跨所有班级）
     * 
     * @param studentId 学生ID
     * @return 总课时数
     */
    @Select("SELECT COALESCE(SUM(total_hours), 0) FROM lesson WHERE student_id = #{studentId}")
    Integer sumTotalHoursByStudentId(@Param("studentId") Long studentId);

    /**
     * 统计指定学生的剩余课时数（跨所有班级）
     * 
     * @param studentId 学生ID
     * @return 剩余课时数
     */
    @Select("SELECT COALESCE(SUM(remaining_hours), 0) FROM lesson WHERE student_id = #{studentId}")
    Integer sumRemainingHoursByStudentId(@Param("studentId") Long studentId);

    /**
     * 插入课时记录
     * 
     * @param lesson 课时信息
     * @return 影响行数
     */
    int insert(Lesson lesson);

    /**
     * 更新课时记录
     * 
     * @param lesson 课时信息
     * @return 影响行数
     */
    int updateById(Lesson lesson);

    /**
     * 根据学生ID更新课时记录（更新该学生的第一个班级记录，用于兼容性）
     * 
     * @param lesson 课时信息
     * @return 影响行数
     */
    int updateByStudentId(Lesson lesson);

    /**
     * 批量插入课时记录
     * 
     * @param lessons 课时记录列表
     * @return 影响行数
     */
    int batchInsert(@Param("lessons") List<Lesson> lessons);

    /**
     * 查询所有学生的课时信息
     * 
     * @return 课时信息列表
     */
    List<Lesson> selectAll();

    /**
     * 根据剩余课时范围查询学生
     * 
     * @param minHours 最小剩余课时
     * @param maxHours 最大剩余课时
     * @return 课时信息列表
     */
    List<Lesson> selectByRemainingHoursRange(@Param("minHours") Integer minHours, @Param("maxHours") Integer maxHours);

    /**
     * 统计剩余课时不足的学生数量
     * 
     * @param threshold 阈值
     * @return 学生数量
     */
    Integer countStudentsWithInsufficientHours(@Param("threshold") Integer threshold);
}
